﻿using System;
using System.Windows.Controls.Primitives;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.clases;
using System.ComponentModel;
using System.IO;
using System.Diagnostics;
using produccion.vistamodelo;
using produccion.reportes;
using System.Threading;
using System.Globalization;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmResumenDeVentasPorMes.xaml
    /// </summary>
    public partial class FrmAnalisisVentasEnClientes : Window
    {
        #region FJRF - VARIABLES GENERIAS DE TODO EL FORMULARIO
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        DataTable DtConsultaPrincipal;//FJRF - Usamos este DataTable para hacer consultas generales
        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        DataTable DtEncabezadoYParametros;//FJRF - Usamos este DataTable para hacer consultas generales del os encabezados mas los parametros
        DataTable DtImprimir;//FJRF - Usamos este DataTable para imprimir
        DataSet DsImprimir;//FJRF - Usamos este dataset para la impresion de consultas

        string StrMensajeBox = "";//FJRF - Para los mensajes de las cajas de texto
        string StrCaptionBox = "";//FJRF - Para los mensajes de los caption de las cajas de texto

        string StrCodigoPrimerColorReferencia;
        string strCliente;//FJRF - Para saber cual quiente se envia
        
        String StrImprimirReporte;//FJRF - Para saber que reporte imprimir
        String StrEmpresaSeleccionada;//FJRF - Para saber la empresa seleccionada

        //String StrRutaReporteCrystalReport = @"c:\produccion\produccion\reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        String StrRutaReporteCrystalReport = @"reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        #endregion

        public FrmAnalisisVentasEnClientes()
        {
            InitializeComponent();
        }

        #region FJRF - OBJETOS DEL FORMULARIO
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

            string strTituloVentana = "ANALISIS VENTAS EN CLIENTES" + " - Usuario:" + MDOgeneral.usuario + " - [FrmAnalisisVentasEnClientes]";//FJRF - Armamos el titulo de la ventana
            Title = strTituloVentana;//FJRF - Ponemos el titulo de la ventana

            #region FJRF - CreamosLosAños
            DateTime DttFecha = DateTime.Now;//FJRF - Creamos una variable que tendra la fecha del sistema


            DtpFechaDesde.SelectedDate = new DateTime(DttFecha.Year, DttFecha.Month, 1);
            DtpFechaHasta.SelectedDate = DttFecha;
            #endregion

            MDOgeneral.DesconectarBogota();//FJRF - Si esta conectado nos desconectamos
            MDOgeneral.ConectarBogota();//FJRF - Nos conectamos con bogota
        }
        private void RdobtnEmpresaAlcantara_Checked(object sender, RoutedEventArgs e)
        {
            if (RdobtnEmpresaAlcantara.IsChecked == true)
            {
                strCliente = "A";
                StrEmpresaSeleccionada = RdobtnEmpresaAlcantara.Content.ToString();
                PttV_Limpiar();//FJRF - Limpiamos los datos
            }
        }
        private void RdobtnEmpresaBaldini_Checked(object sender, RoutedEventArgs e)
        {
            if (RdobtnEmpresaBaldini.IsChecked == true)
            {
                strCliente = "B";
                StrEmpresaSeleccionada = RdobtnEmpresaBaldini.Content.ToString();
                PttV_Limpiar();//FJRF - Limpiamos los datos
            }
        }
        private void DtpFechaDesde_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            PttV_Limpiar();//FJRF - Limpiamos los datos
        }
        private void DtpFechaHasta_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            PttV_Limpiar();//FJRF - Limpiamos los datos
        }
        protected void PttV_Limpiar()
        {
            if (DtConsultaPrincipal != null)
            {
                DtgAnalisisVentasEnClientes.ItemsSource = null;
                DtConsultaPrincipal = null;
                DtgAnalisisVentasEnClientes.Items.Clear();
            }
            if (DtConsulta != null)
            {
                DtgAnalisisVentasEnClientesDetalle.ItemsSource = null;
                DtConsultaPrincipal = null;
                DtgAnalisisVentasEnClientes.Items.Clear();
            }
            if (BtnImprimirDetalle != null)
            {
                BtnImprimirDetalle.Visibility = Visibility.Hidden;//FJRF - Ponemos el imprimir detalle invisible
            }
            imgFoto.Source = null;
        }
        private void DtgAnalisisVentasEnClientes_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "CANTIDADCOMPRA" || strNombreColumna == "VALORCOMPRA" || strNombreColumna == "CANTIDADVENTA" || strNombreColumna == "VALORVENTA" || strNombreColumna == "CANTIDADDESPACHADO" || strNombreColumna == "VALORDESPACHADO")
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Alineamos la celda a la derecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }
        private void DtgAnalisisVentasEnClientesDetalle_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "CANTIDADCOMPRA" || strNombreColumna == "VALORCOMPRA" || strNombreColumna == "CANTIDADVENTA" || strNombreColumna == "VALORVENTA" || strNombreColumna == "CANTIDADDESPACHADO" || strNombreColumna == "VALORDESPACHADO")
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Alineamos la celda a la derecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }
        private void DtgAnalisisVentasEnClientes_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            try
            {
                Mouse.OverrideCursor = Cursors.Wait;

                if (DtgAnalisisVentasEnClientes.SelectedItem == null)//FJRF - Si no hay algun pedido seleccionado hacemos lo siguiente
                {
                    Mouse.OverrideCursor = Cursors.Arrow;
                    return;//FJRF - Nos salimos
                }

                DataRowView dr = DtgAnalisisVentasEnClientes.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
                DataRow dr1 = dr.Row;//FJRF - Asignamos las finas
                String StrCodigoReferencia = Convert.ToString(dr1.ItemArray[0]);//FJRF - Decimos que en la columna cero nos traiga el dato de la fila seleccionada
                String StrNombreReferencia = Convert.ToString(dr1.ItemArray[1]);//FJRF - Decimos que en la columna cero nos traiga el dato de la fila seleccionada

                LblTituloDtgAnalisisVentasEnClientesDetalle.Content = "                                                                                                                  DATOS DETALLADOS REFERENCIA - " + StrCodigoReferencia;

                StrConsulta = "SELECT ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "CODREF_TMP AS CODIGO, CODCOL_TMP AS COLOR, NOMREF_TMP AS REFERENCIA, CANCOM_TMP AS CANTIDADCOMPRA, VLRCOM_TMP AS VALORCOMPRA, CANVEN_TMP AS CANTIDADVENTA, VLRVEN_TMP AS VALORVENTA, CANDES_TMP AS CANTIDADDESPACHADO, VLRDES_TMP AS VALORDESPACHADO ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "FROM tmprescli ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "WHERE CODREF_TMP = '" + StrCodigoReferencia + "' ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "ORDER BY CANVEN_TMP DESC ";//FJRF - Armamos la consulta

                DtConsulta = new DataTable();//FJRF - Limpiamos la tabla por si tiene datos ya que esta se usa para otros procesos

                #region FJRF - Establecemos en donde se va a conectar para la consulta de datos
                if (RdobtnEmpresaAlcantara.IsChecked == true)//FJRF - si entra por alcantara hacemos lo siguiente
                {
                    DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Cargamos la consulta con los datos encontrados
                }
                else//FJRF - Si entro a consultar otra empresa entonces
                {
                    if (RdobtnEmpresaBaldini.IsChecked == true)//FJRF - Si la empresa consultada es baldini hacemos lo siguiente
                    {
                        DtConsulta = MdoGeneral.ConsultaBogota(StrConsulta);//FJRF - Cargamos la consulta con los datos encontrados
                    }
                }
                #endregion

                DtgAnalisisVentasEnClientesDetalle.ItemsSource = DtConsulta.DefaultView;

                PonerImagen(StrCodigoReferencia, "", StrNombreReferencia);//FJRF - Buscamos la imagen
                txtReferencia.Text = StrCodigoReferencia;

                BtnImprimirDetalle.Visibility = Visibility.Visible;//FJRF - Ponemos el imprimir detalle visible

                Mouse.OverrideCursor = Cursors.Arrow;
            }
            catch (Exception ex)//FJRF - Si pasa un error hacemos lo siguiente
            {
                MessageBox.Show(ex.Message);//FJRF - Mostramos el error en pantalla
                Mouse.OverrideCursor = Cursors.Arrow;
            }
        }
        private void DtgAnalisisVentasEnClientes_KeyUp(object sender, KeyEventArgs e)
        {
            try
            {
                Mouse.OverrideCursor = Cursors.Wait;

                if (DtgAnalisisVentasEnClientes.SelectedItem == null)//FJRF - Si no hay algun pedido seleccionado hacemos lo siguiente
                {
                    Mouse.OverrideCursor = Cursors.Arrow;
                    return;//FJRF - Nos salimos
                }

                DataRowView dr = DtgAnalisisVentasEnClientes.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
                DataRow dr1 = dr.Row;//FJRF - Asignamos las finas
                String StrCodigoReferencia = Convert.ToString(dr1.ItemArray[0]);//FJRF - Decimos que en la columna cero nos traiga el dato de la fila seleccionada
                String StrNombreReferencia = Convert.ToString(dr1.ItemArray[1]);//FJRF - Decimos que en la columna cero nos traiga el dato de la fila seleccionada

                LblTituloDtgAnalisisVentasEnClientesDetalle.Content = "                                                                                                                  DATOS DETALLADOS REFERENCIA - " + StrCodigoReferencia;

                StrConsulta = "SELECT ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "CODREF_TMP AS CODIGO, CODCOL_TMP AS COLOR, NOMREF_TMP AS REFERENCIA, CANCOM_TMP AS CANTIDADCOMPRA, VLRCOM_TMP AS VALORCOMPRA, CANVEN_TMP AS CANTIDADVENTA, VLRVEN_TMP AS VALORVENTA, CANDES_TMP AS CANTIDADDESPACHADO, VLRDES_TMP AS VALORDESPACHADO ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "FROM tmprescli ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "WHERE CODREF_TMP = '" + StrCodigoReferencia + "' ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "ORDER BY CANVEN_TMP DESC ";//FJRF - Armamos la consulta

                DtConsulta = new DataTable();//FJRF - Limpiamos la tabla por si tiene datos ya que esta se usa para otros procesos

                #region FJRF - Establecemos en donde se va a conectar para la consulta de datos
                if (RdobtnEmpresaAlcantara.IsChecked == true)//FJRF - si entra por alcantara hacemos lo siguiente
                {
                    DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Cargamos la consulta con los datos encontrados
                }
                else//FJRF - Si entro a consultar otra empresa entonces
                {
                    if (RdobtnEmpresaBaldini.IsChecked == true)//FJRF - Si la empresa consultada es baldini hacemos lo siguiente
                    {
                        DtConsulta = MdoGeneral.ConsultaBogota(StrConsulta);//FJRF - Cargamos la consulta con los datos encontrados
                    }
                }
                #endregion

                DtgAnalisisVentasEnClientesDetalle.ItemsSource = DtConsulta.DefaultView;

                PonerImagen(StrCodigoReferencia, "", StrNombreReferencia);//FJRF - Buscamos la imagen
                txtReferencia.Text = StrCodigoReferencia;

                BtnImprimirDetalle.Visibility = Visibility.Visible;//FJRF - Ponemos el imprimir detalle visible
                
                Mouse.OverrideCursor = Cursors.Arrow;
            }
            catch (Exception ex)//FJRF - Si pasa un error hacemos lo siguiente
            {
                MessageBox.Show(ex.Message);//FJRF - Mostramos el error en pantalla
                Mouse.OverrideCursor = Cursors.Arrow;
            }
        }
        private void DtgAnalisisVentasEnClientesDetalle_KeyUp(object sender, KeyEventArgs e)
        {
            try
            {
                Mouse.OverrideCursor = Cursors.Wait;

                if (DtgAnalisisVentasEnClientesDetalle.SelectedItem == null)//FJRF - Si no hay algun pedido seleccionado hacemos lo siguiente
                {
                    Mouse.OverrideCursor = Cursors.Arrow;
                    return;//FJRF - Nos salimos
                }

                DataRowView dr = DtgAnalisisVentasEnClientesDetalle.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
                DataRow dr1 = dr.Row;//FJRF - Asignamos las finas
                String StrCodigoReferencia = Convert.ToString(dr1.ItemArray[0]);//FJRF - Decimos que en la columna 0 nos traiga el dato de la fila seleccionada
                String StrColorReferencia = Convert.ToString(dr1.ItemArray[1]);//FJRF - Decimos que en la columna 1 nos traiga el dato de la fila seleccionada
                String StrNombreReferencia = Convert.ToString(dr1.ItemArray[2]);//FJRF - Decimos que en la columna 2 nos traiga el dato de la fila seleccionada

                PonerImagen(StrCodigoReferencia, StrColorReferencia, StrNombreReferencia);//FJRF - Buscamos la imagen
                txtReferencia.Text = StrCodigoReferencia;

                Mouse.OverrideCursor = Cursors.Arrow;
            }
            catch (Exception ex)//FJRF - Si pasa un error hacemos lo siguiente
            {
                MessageBox.Show(ex.Message);//FJRF - Mostramos el error en pantalla
                Mouse.OverrideCursor = Cursors.Arrow;
            }
        }
        private void DtgAnalisisVentasEnClientesDetalle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            try
            {
                Mouse.OverrideCursor = Cursors.Wait;

                if (DtgAnalisisVentasEnClientesDetalle.SelectedItem == null)//FJRF - Si no hay algun pedido seleccionado hacemos lo siguiente
                {
                    Mouse.OverrideCursor = Cursors.Arrow;
                    return;//FJRF - Nos salimos
                }

                DataRowView dr = DtgAnalisisVentasEnClientesDetalle.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
                DataRow dr1 = dr.Row;//FJRF - Asignamos las finas
                String StrCodigoReferencia = Convert.ToString(dr1.ItemArray[0]);//FJRF - Decimos que en la columna 0 nos traiga el dato de la fila seleccionada
                String StrColorReferencia = Convert.ToString(dr1.ItemArray[1]);//FJRF - Decimos que en la columna 1 nos traiga el dato de la fila seleccionada
                String StrNombreReferencia = Convert.ToString(dr1.ItemArray[2]);//FJRF - Decimos que en la columna 2 nos traiga el dato de la fila seleccionada

                PonerImagen(StrCodigoReferencia, StrColorReferencia, StrNombreReferencia);//FJRF - Buscamos la imagen
                txtReferencia.Text = StrCodigoReferencia;

                Mouse.OverrideCursor = Cursors.Arrow;
            }
            catch (Exception ex)//FJRF - Si pasa un error hacemos lo siguiente
            {
                MessageBox.Show(ex.Message);//FJRF - Mostramos el error en pantalla
                Mouse.OverrideCursor = Cursors.Arrow;
            }
        }
        private void BtnProcesar_Click(object sender, RoutedEventArgs e)
        {
            PttV_Procesar();
        }
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            MDOgeneral.DesconectarBogota();//FJRF - Nos desconectamos de la base de datos
            this.Close();//FJRF - Cierra el modulo actual
        }
        private void BtnImprimir_Click(object sender, RoutedEventArgs e)
        {
            StrImprimirReporte = "Consolidado";
            PttV_Imprimir();
        }
        private void BtnImprimirDetalle_Click(object sender, RoutedEventArgs e)
        {
            StrImprimirReporte = "Detallado";
            PttV_Imprimir();
        }

        #endregion

        #region FJRF - PROCEDIMIENTOS Y FUNCIONES PROPIAS DEL FORMULARIO
        protected void PttV_Imprimir()
        {
            try//FJRF - Validamos el proceso de impresion 
            {
                String StrRutaReporteAImprimir = StrRutaReporteCrystalReport + "rptAnalisisVentasEnClientes.rpt";//FJRF - Armamos la ruta completa donde estara el reporte
                if (System.IO.File.Exists(StrRutaReporteAImprimir) == true)//FJRf - Si el reporte existe hacemos lo siguiente
                {
                    DtImprimir = new DataTable("DtDatosReporte");

                    if (StrImprimirReporte == "Consolidado")
                    {
                        if (DtConsultaPrincipal == null)
                        {
                            Msgbox("PROCESO CANCELADO", "No hay datos para imprimir", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                        }
                        else
                        {
                            DtImprimir = DtConsultaPrincipal.Copy();
                        }

                    }
                    else if (StrImprimirReporte == "Detallado")
                    {
                        if (DtConsulta == null)
                        {
                            Msgbox("PROCESO CANCELADO", "No ha seleccionado una referencia para generar un detalle de la referencia seleccionada", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                        }
                        else
                        {
                            DtImprimir = DtConsulta.Copy();
                        }
                    }

                    DtImprimir.TableName = "DtDatosReporte";

                    #region FJRF - ImprimimosElReporte
                    if (DtImprimir == null)//FJRF - Validamos que el reporte tenga datos para realizar el proceso de impresion
                    {
                        Msgbox("PROCESO CANCELADO", "No existen datos para imprimir el reporte", MessageBoxButton.OK, MessageBoxImage.Error); //FJRF - Informamos al usuario
                    }
                    else//FJRF - Si trae datos hacemos lo siguiente
                    {
                        CargarParametrosImpresion();//FJRF - Cargamos los parametros para la impresion, esto contiene titulo y parametros enviados al cystalreport

                        DsImprimir = new DataSet("dsAnalisisVentasEnClientes");//FJRF - DataSet que esta vinculado al CrystalReport

                        //FJRF - ADICIONAMOS LAS TABLAS QUE NECESITE EL DATASET ASOCIADO AL CRYSTAL
                        DsImprimir.Tables.Add(DtEncabezadoYParametros.Copy());//Encabezado Informe
                        DsImprimir.Tables.Add(DtImprimir.Copy());//Detalle del Informe

                        produccion.reportes.Vista vista = new produccion.reportes.Vista { ds = DsImprimir, reporte = StrRutaReporteAImprimir };//FJRF - Enviamos los datos para que se imprima el reporte
                        vista.Show();//FJRF - Ejecutamos el reporte para que se muestre visualmente
                    }
                    #endregion
                }
                else//FJRF - Si el reporte no existe hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", "El reporte no existe en la ruta: [" + StrRutaReporteAImprimir + "] por favor comuniquese con el administrador del sistema para que corriga este inconveniente.", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                }
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO - [Error del sistema]", ex.Message.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
            }
        }
        private void CargarParametrosImpresion()
        {
            #region FJRF - CreamosLasColmnasDelEncabezado
            DtEncabezadoYParametros = new DataTable("DtEncabezadoYParametros");//FJRF - Creamos la tabla que contendra el encabezado del informe

            //FJRF - CREAMOS LAS COLUMNAS DE LOS PARAMETROS A ENVIAR
            DtEncabezadoYParametros.Columns.Add("StrNombreEmpresa", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtEncabezadoYParametros.Columns.Add("StrTituloReporte", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte
            DtEncabezadoYParametros.Columns.Add("StrSubTituloReporte", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrParametroEmpresa", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrParametroFechaDesde", System.Type.GetType("System.DateTime"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrParametroFechaHasta", System.Type.GetType("System.DateTime"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            #endregion

            #region FJRF - AsignamosEnLasColmnasDelEncabezadoLosValores

            DataRow drEncabezadoYParametros;//FJRF - Creamos un manejador de filas para el DataTable actual

            drEncabezadoYParametros = DtEncabezadoYParametros.NewRow();//FJRF - Agregamos una nueva fila
            //FJRF - ASIGNAMOS LOS VALORES
            drEncabezadoYParametros["StrNombreEmpresa"] = MDOgeneral.strEmpresaImprime;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            
            drEncabezadoYParametros["StrTituloReporte"] = txtTituloFormulario.Text.Trim();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            if (StrImprimirReporte == "Consolidado")
            {
                drEncabezadoYParametros["StrSubTituloReporte"] = LblTituloDtgAnalisisVentasEnClientes.Content.ToString().Trim();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            }
            else if (StrImprimirReporte == "Detallado")
            {
                drEncabezadoYParametros["StrSubTituloReporte"] = LblTituloDtgAnalisisVentasEnClientesDetalle.Content.ToString().Trim();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            }

            drEncabezadoYParametros["StrParametroEmpresa"] = StrEmpresaSeleccionada;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drEncabezadoYParametros["StrParametroFechaDesde"] = DtpFechaDesde.SelectedDate;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrParametroFechaHasta"] = DtpFechaDesde.SelectedDate;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            DtEncabezadoYParametros.Rows.Add(drEncabezadoYParametros);//FJRF - Agregamos a la tabla el registro creado
            DtEncabezadoYParametros.TableName = "DtEncabezadoYParametros";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet
            #endregion
        }
        protected void PttV_Procesar()
        {
            Mouse.OverrideCursor = Cursors.Wait;

            BtnImprimirDetalle.Visibility = Visibility.Hidden;//FJRF - Ponemos el imprimir detalle invisible

            EjecutarSp_SP_RESUMENENCLIENTE(strCliente, DtpFechaDesde.SelectedDate.Value, DtpFechaHasta.SelectedDate.Value);

            StrConsulta = "SELECT ";
            StrConsulta = StrConsulta + "CODREF_TMP AS CODIGO, NOMREF_TMP AS REFERENCIA, SUM(CANCOM_TMP) AS CANTIDADCOMPRA, SUM(VLRCOM_TMP) AS VALORCOMPRA, SUM(CANVEN_TMP) AS CANTIDADVENTA, SUM(VLRVEN_TMP) AS VALORVENTA, SUM(CANDES_TMP) AS CANTIDADDESPACHADO, SUM(VLRDES_TMP) AS VALORDESPACHADO ";
            StrConsulta = StrConsulta + "FROM tmprescli ";
            StrConsulta = StrConsulta + "GROUP BY CODREF_TMP, NOMREF_TMP ";
            StrConsulta = StrConsulta + "ORDER BY CANTIDADVENTA DESC ";

            #region FJRF - Establecemos en donde se va a conectar para la consulta de datos
            if (RdobtnEmpresaAlcantara.IsChecked == true)//FJRF - si entra por alcantara hacemos lo siguiente
            {
                DtConsultaPrincipal = MdoGeneral.consulta(StrConsulta);//FJRF - Consultamos la tabla en la base de datos de bogota
            }
            else//FJRF - Si entro a consultar otra empresa entonces
            {
                if (RdobtnEmpresaBaldini.IsChecked == true)//FJRF - Si la empresa consultada es baldini hacemos lo siguiente
                {
                    DtConsultaPrincipal = MdoGeneral.ConsultaBogota(StrConsulta);//FJRF - Consultamos la tabla en la base de datos de bogota
                }
            }
            #endregion

            DtgAnalisisVentasEnClientes.ItemsSource = DtConsultaPrincipal.DefaultView;

            Mouse.OverrideCursor = Cursors.Arrow;
        }

        private void EjecutarSp_SP_RESUMENENCLIENTE(String Str_Cliente, DateTime Dtt_FechaDesde, DateTime Dtt_FechaHasta)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                MDOgeneral.spComando.CommandText = "SP_RESUMENENCLIENTE";

                #region FJRF - Establecemos en donde se va a conectar
                if (RdobtnEmpresaAlcantara.IsChecked == true)//FJRF - si entra por alcantara hacemos lo siguiente
                {
                    MDOgeneral.spComando.Connection = MDOgeneral.conexion;//FJRF - Nos conectamos de forma normal
                }
                else//FJRF - Si entro a consultar otra empresa entonces
                {
                    if (RdobtnEmpresaBaldini.IsChecked == true)//FJRF - Si la empresa consultada es baldini hacemos lo siguiente
                    {
                        MDOgeneral.spComando.Connection = MDOgeneral.ConexionBogota;//FJRF - Nos conectamos con bogota en la ejecucion del sp
                    }
                }
                #endregion
                
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_cliente", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = Str_Cliente;

                MDOgeneral.spComando.Parameters.Add("pdt_desde", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = Dtt_FechaDesde.ToShortDateString();
                MDOgeneral.spComando.Parameters.Add("pdt_hasta", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = Dtt_FechaHasta.ToShortDateString();

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                StrCaptionBox = "PROCESO CANCELADO";//FJRF - Titulo del mensaje
                StrMensajeBox = ex.Message.ToString();//FJRF - Mensaje a enviar

                Msgbox(StrCaptionBox, StrMensajeBox, MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
            }
        }

        #region FJRF - CajaDeTextoMsgbox
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        #region FJRF - ParaObtenerLasPropiedadesDeLaCeldaDelGrid
        //DataGridCell cell = DataGridHelper.GetCell(dgEst, dgEst.SelectedIndex, 0);//FJRF - Asi se llama
        static class DataGridHelper
        {
            static public DataGridCell GetCell(DataGrid dg, int row, int column)
            {
                DataGridRow rowContainer = GetRow(dg, row);

                if (rowContainer != null)
                {
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                    // try to get the cell but it may possibly be virtualized
                    DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    if (cell == null)
                    {
                        // now try to bring into view and retreive the cell
                        dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                        cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    }
                    return cell;
                }
                return null;
            }

            static public DataGridRow GetRow(DataGrid dg, int index)
            {
                DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                if (row == null)
                {
                    // may be virtualized, bring into view and try again
                    dg.ScrollIntoView(dg.Items[index]);
                    row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                }
                return row;
            }

            static T GetVisualChild<T>(Visual parent) where T : Visual
            {
                T child = default(T);
                int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < numVisuals; i++)
                {
                    Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                    child = v as T;
                    if (child == null)
                    {
                        child = GetVisualChild<T>(v);
                    }
                    if (child != null)
                    {
                        break;
                    }
                }
                return child;
            }
        }
        #endregion

        #region FJRF - ParaAlinearALaDerecha
        public static Style newCellStyleAlinearDerecha()
        {
            System.Windows.Style style = new Style(typeof(DataGridCell));
            style.Setters.Add(new System.Windows.Setter
            {
                Property = Control.HorizontalAlignmentProperty,
                Value = HorizontalAlignment.Right
            });
            return style;
        }
        #endregion

        #region FJRF - CargarCombosDejandoUnEspacioEnBlanco
        private Boolean CargarCombo(ComboBox CboComboACargar, string strConsultaOracle, string strSelectedValuePath, string strDisplayMemberPath, string strCodigoNombre)
        {
            Boolean BooSiHayDatos = false;//FJRF - Variable para informar si hay datos o no
            CboComboACargar.ItemsSource = null;
            CboComboACargar.Items.Clear();//FJRF - Borramos los posibles datos que pueda tener el combo

            DtConsulta = new DataTable();//FJRF - Inicializamos la variable
            DsConsulta = new DataSet();//FJRF - Inicializamos la variable

            DtConsulta = MdoGeneral.consulta(strConsultaOracle);//FJRF - Realizamos la consulta y retornamos los datos

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                BooSiHayDatos = true;//FJRF - Informamos que hay datos

                DataRow drEncabezado;
                drEncabezado = DtConsulta.NewRow();

                if (strCodigoNombre == "Codigo")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZ999";
                    drEncabezado[strDisplayMemberPath] = "TODOS";
                }
                if (strCodigoNombre == "Nombre")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZ999";
                    drEncabezado[strDisplayMemberPath] = "TODOS";
                }

                DtConsulta.Rows.Add(drEncabezado);

                DsConsulta.Tables.Add(DtConsulta);//FJRF - Adicionameos el datatable al dataset
                CboComboACargar.ItemsSource = DsConsulta.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboComboACargar.SelectedValuePath = strSelectedValuePath.ToUpper();//FJRF - Cargamos la posicion
                CboComboACargar.DisplayMemberPath = strDisplayMemberPath.ToUpper();//FJRF - Decimos cual dato se mostrara

                CboComboACargar.SelectedValue = "ZZZ999";//FJRF - Ponemos el combo en la primera posicion
            }
            return BooSiHayDatos;//FJRF - Avisamos que si hay o no hay datos
        }
        #endregion

        #region FJRF - PonerFoto

        private void PonerImagen(string strCodigoReferencia, string strCodigoColor, string strNombreReferencia)
        {
            if (String.IsNullOrEmpty(strCodigoColor))
            {
                BitmapImage b = new BitmapImage();
                if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg"))
                {
                    b.BeginInit();
                    b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg");
                    b.EndInit();
                    imgFoto.Stretch = Stretch.Fill;
                    imgFoto.Source = b;
                    ImagenTooltip.Source = b;
                    txbNombreImagen.Text = strNombreReferencia;
                }
                else
                {
                    imgFoto.Source = null;
                }
            }
            else
            {
                BitmapImage b = new BitmapImage();
                if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg"))
                {
                    b.BeginInit();
                    b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg");
                    b.EndInit();
                    imgFoto.Stretch = Stretch.Fill;
                    imgFoto.Source = b;
                    ImagenTooltip.Source = b;
                    txbNombreImagen.Text = strNombreReferencia;
                }
                else
                {
                    if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg"))
                    {
                        b.BeginInit();
                        b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg");
                        b.EndInit();
                        imgFoto.Stretch = Stretch.Fill;
                        imgFoto.Source = b;
                        ImagenTooltip.Source = b;
                        txbNombreImagen.Text = strNombreReferencia;
                    }
                    else
                    {
                        Boolean BooExiste = false;
                        //Foto para cualquier color-Consultar colores para referencia
                        clases.CLSMAEPRO mae = new clases.CLSMAEPRO { CODREF_PRO = strCodigoReferencia };
                        DataTable val = mae.BuscarColor();

                        foreach (DataRow r in val.Rows)
                        {
                            if (!String.IsNullOrEmpty(r["Codigo"].ToString()))
                            {
                                string StrRuta = MDOgeneral.Fotos_BOSI + strCodigoReferencia + r["Codigo"].ToString() + ".jpg";
                                if (File.Exists(StrRuta))
                                {
                                    BitmapImage BitFoto = new BitmapImage();
                                    BitFoto.BeginInit();
                                    BitFoto.UriSource = new Uri(StrRuta);
                                    BitFoto.EndInit();
                                    imgFoto.Source = BitFoto;
                                    ImagenTooltip.Source = BitFoto;
                                    txbNombreImagen.Text = strNombreReferencia;

                                    BooExiste = true;

                                    break;//FJRF - Si la encontro nos salimos
                                }
                            }
                        }

                        if (BooExiste == false)
                        {
                            imgFoto.Source = null;
                        }
                    }
                }
            }
        }

        #endregion

        private void imgFoto_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            //Para llamar el PDF de la ficha tecnica de la referencia
            if (File.Exists(MDOgeneral.Fotos_BOSI + txtReferencia.Text.Trim() + ".PDF"))
            {
                //MessageBox.Show("Si existe la ficha tecnica", "Confirmación", MessageBoxButton.OK, MessageBoxImage.Hand, MessageBoxResult.OK);
                String fileName = MDOgeneral.Fotos_BOSI + txtReferencia.Text.Trim() + ".PDF";
                System.Diagnostics.Process process = new System.Diagnostics.Process();
                process.StartInfo.FileName = fileName;
                process.Start();
            }
            else
            {
                MessageBox.Show("No existe la ficha tecnica", "Confirmación", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
            }
        }

        #endregion
    }
}

